package edu.zut.main.thread;

public class DeadLock {

    public static void main(String[] args) {
        People boy = new People("boy");
        People girl = new People("girl");
        new Thread(new Eat(boy)).start();
        new Thread(new Eat(girl)).start();
    }

}
/**
 * 死锁：是指两个或两个以上的进程在执行过程中，
 * 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象，
 * 若无外力作用，它们都将无法推进下去。
 * 此时称系统处于死锁状态或系统产生了死锁，
 * 这些永远在互相等待的进程称为死锁进程。
 *     刀 叉
 */

//刀
class Knife{

}

//叉子
class Fork{

}
class People{
    //不管几个人，只有一组刀叉
    static Knife knife = new Knife();
    static Fork fork = new Fork();

    private String name;

    public People(String name) {
        this.name = name;
    }

    public void eat(){
        if (name.equals("boy")){
            //在锁定刀之后，还想把叉子锁起来
            synchronized (knife){
                System.out.println("boy现在有一把刀，缺叉子");
            }
            //一定要注意，不要嵌套锁，不然可能会造成死锁；用完的资源记得及时把锁解除
            synchronized (fork){
                System.out.println("boy又拿到了叉子");
            }
        }
        if (name.equals("girl")){
            //girl 拿到了叉子，还想占有刀
            synchronized (fork){
                System.out.println("girl有一把叉子，还想刀");
            }
            synchronized (knife){
                System.out.println("girl现在刀叉都有了");
            }
        }
    }
}

class Eat implements Runnable{

    private People people;

    public Eat(People people) {
        this.people = people;
    }

    @Override
    public void run() {
        people.eat();
    }
}
